package com.myrule;

import java.util.List;
import java.util.Random;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

public class RandomRule_5 extends AbstractLoadBalancerRule{

	  	Random rand;

	  	private int total = 0; //总共被调用的次数
	  	private int currentIndex = 0; //当前提供机器的服务号
	  	
	    public RandomRule_5() {
	        rand = new Random();
	    }

	    /**
	     * Randomly choose from all living servers
	     */
	   // @edu.umd.cs.findbugs.annotations.SuppressWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE")
	    public Server choose(ILoadBalancer lb, Object key) {
	        if (lb == null) {
	            return null;
	        }
	        Server server = null;

	        while (server == null) {
	            if (Thread.interrupted()) {
	                return null;
	            }
	            List<Server> upList = lb.getReachableServers();
	            List<Server> allList = lb.getAllServers();

	            int serverCount = allList.size();
	            if (serverCount == 0) {
	                /*
	                 * No servers. End regardless of pass, because subsequent passes
	                 * only get more restrictive.
	                 */
	                return null;
	            }
//	            int index = rand.nextInt(serverCount);
//	            server = upList.get(index);
	            
	            if(total < 5){
	            	server = upList.get(currentIndex);
	            	total++;
	            	
	            }else{
	            	total=0;
	            	currentIndex++;
	            	if(currentIndex > upList.size()){
	            		currentIndex = 0;
	            	}
	            	
	            }
	            
	            if (server == null) {
	                /*
	                 * The only time this should happen is if the server list were
	                 * somehow trimmed. This is a transient condition. Retry after
	                 * yielding.
	                 */
	                Thread.yield();
	                continue;
	            }

	            if (server.isAlive()) {
	                return (server);
	            }

	            // Shouldn't actually happen.. but must be transient or a bug.
	            server = null;
	            Thread.yield();
	        }

	        return server;

	    }

		@Override
		public Server choose(Object key) {
			return choose(getLoadBalancer(), key);
		}

		@Override
		public void initWithNiwsConfig(IClientConfig clientConfig) {
			// TODO Auto-generated method stub
			
		}

}
